Read more of this story at Slashdot.
Read more of this story at Slashdot.
One reason plastics are used so often is that they’re chemically inert, meaning bags, food containers, and cups don't react with what we put in them. Yet they can still break down into microplastics, which turn up in drinking water, human blood, arteries, and brains. The consequences of that are uncertain.
“Whether microplastics can directly cause human disease is still being researched,” said Wei Min, a chemist at Columbia University. In a new Nature study, Min's team took a step toward answering this question by demonstrating that microplastics are likely not as chemically inert as we might expect.
Min's lab has spent years working on microdroplet chemistry, studying how water broken into tiny droplets behaves at its boundary with air. These droplets have been reported to generate reactive oxygen species, or ROS, a family of harmful, oxygen-containing molecules. “ROS will essentially bump into proteins, lipids, DNA, and cause damage,” Min said. “You could break a DNA strand into segments. You could mutate DNA; you could misfold proteins.”
Many animal studies have tied microplastic toxicity to oxidative stress, which is caused by ROS. So the team wondered if the boundary between water and plastic might do something similar. “We got inspired by that field,” Min said.
In the first test, the team stirred polystyrene powder into water containing methyl orange, a yellow dye that ROS break apart. Over 10 days, the solution faded almost to colorless, losing nearly 90 percent of the dye. In ethanol or other solvents, the dye stayed intact. Min and his colleagues concluded that whatever chemistry polystyrene was undergoing needed water to happen. So they ran more tests.
First was electron spin resonance, a technique that directly detects radicals—atoms or molecules with an unpaired electron that makes them particularly reactive. The polystyrene powder and water mixture contained hydroxyl radicals, a highly reactive ROS.
Next, the team used a fluorescent sensor that lights up only when it reacts with hydroxyl radicals. “You don't see it, but once it reacts with local ROS, it turns into a bright color,” Min said. Under a microscope, the glow concentrated on the surfaces of the plastic particles and kept building over time.
The effect was not unique to polystyrene either. Scientists tested six common plastics—polyethylene, polypropylene, polystyrene, PVC, PET, and acrylic—and all of them generated radicals. The most water-repellent plastics, polyethylene and polypropylene, were the most active, while PET and acrylic, which contain chemical groups that attract water, were the least.
“The simplest answer is the most water-repellent ones change the water structure the most,” Min said. In ordinary, or bulk, water, each molecule is held in a network of hydrogen bonds with its neighbors. But a few layers of water molecules pressed against a water-repellent surface lose some of those partners. “Their structure is no longer the regular water structure. They are perturbed, and their energy is also significantly increased,” Min said.
Water always contains a small number of hydroxide ions, and turning one into a hydroxyl radical requires stripping away an electron. In bulk water, that costs a lot of energy. But simulations run by the group showed that, at a polyethylene surface, hydroxide ions short on hydrogen bonds needed far less energy to form radicals. On top of that, the plastic surfaces build up a negative electric charge in water, which further lowered the energy cost.
But Min’s team still had doubts to address before making any conclusive claims.
Min’s earlier work on microdroplet chemistry has drawn a lot of criticism, with some researchers arguing that the reported reactive chemicals come from contamination or measurement artifacts.
To avoid similar objections, Min and his colleagues used several independent detection methods. They also added a detergent-like surfactant that coats the plastic and disrupts the water layer at its surface. They found that the more surfactant they added, the weaker the plastic's electric charge became and the fewer radicals it produced. “We only change one parameter while keeping all the rest [the same],” Min said. “We're using exactly the same plastics, the same water, the same everything.”
Impurities, Min explained, are typically stable molecules with no reason to spontaneously generate radicals. He is careful not to overstate it, though. “To be absolutely clear, we cannot 100 percent rule out the involvement of impurities,” he said. “But our controls and our theoretical computation studies highly suggest that this is intrinsic to the microplastic-water interface.”
Finally, the team tested if this interface chemistry matters for biological molecules. And it most likely does.
Proteins and DNA can gather on plastic surfaces, and lysozyme, a common test protein, also began clumping into aggregates there. Adding caffeine, which mops up radicals, largely stopped the clumping, pointing to the radicals as the cause.
Mouse red blood cells that touched polystyrene particles broke into fragments, and the damage from each type of plastic tracked how many radicals it produced. The effect also persisted in blood serum.
Min stressed, though, that this indicates that microplastics make people sick by generating ROS. While animal studies often point to ROS as possible roots of oxidative stress and chronic inflammation, ROS can be produced in many ways, including through basic metabolic activity.
Min admitted comparing the magnitude of this effect to the impact of ROS our own cells make is rather tricky.
“If you are really at the interface, you could be significantly affected by this effect, whereas if you are just a few microns away, you don't feel it anymore," Min said. Exposure is another unknown here. Min also emphasized that no one can yet say how many microplastics an average person takes in each year from food, water, and air.
The plastics in the study were mostly fresh, lab-bought powders, unlike weathered particles we encounter in the environment. In the team's tests, older particles with more oxidized surfaces produced somewhat weaker signals. “This aging process is very heterogeneous,” Min said. “Some microplastic particles were made 50 years ago, some were made five days ago.” Finally, there is the question of size.
Microplastics are usually defined as particles smaller than five millimeters, while the minimum cutoff varies between 100 and 1,000 nanometers. Min’s team did not test how variation in microplastic particle size affects water-interface chemistry, but the researchers suspect it might play a role. The same mass of plastic broken into nanoparticles has far more surface area, which might make the effect larger. "This may be another reason for nanoplastics to be more dangerous," Min said.
The researchers argue that if water-repellent surfaces drive the water interface chemistry, plastics could be designed to be less water-repellent, either by changing their molecular structure or including additives. First, though, the team wants to focus on the question their study left open. “We definitely want to see how much this effect is directly contributing to disease or biological problems in animals and humans,” Min said.
Nature, 2026. DOI: 10.1038/s41586-026-11141-y
Read more of this story at Slashdot.
Read more of this story at Slashdot.
We continue our study of C++ futures with std::async.
The more complex case is the std::async. You give std::async a callable and optional parameters to pass to that callable, and you also specify how and when you want the callable to be invoked. You get two axes: Do you want it to be calculated immediately or on demand? Do you want the calculation to happen on the thread that requests the value or on its own thread?
Now, you’d think you could fill out the table like this:
| Immediate | On demand (“deferred”) | |
|---|---|---|
| Same thread | Call now and save the value | Call when waited |
| New thread (“async”) | Start the thread now | Start the thread when waited |
However, that’s not what the C++ standard says.
The C++ standard disallows asking for an immediate value on the same thread. There’s really no value to doing it that way, since there is no actual “future”; it all happens in the present! “This future could have been a function call.”
auto f = std::async({}, calculator);
auto result = f.get();
This would, in theory, mean “Immediately call the calculator and wait for it to produce a value. Store it in the source and return a future that fetches the value from that source.” But that’s the same as just
auto result = calculator();
I’m guessing that the C++ standard disallows it because there’s no point.
The C++ standard also says that if you combine both std::launch::deferred and std::launch::async, it doesn’t mean that you get a calculation that lazy-starts on its own thread. Instead, the standard says that the implementation can choose which flag to honor and which to ignore.
So really, the table is
| Immediate | On demand (“deferred”) | |
|---|---|---|
| Same thread | Illegal | Call when waited |
| New thread (“async”) | Start the thread now | Dealer’s choice |
In all cases, the result of the callable (either a value or an exception) is stored in the source.
Now, I noted that there’s no point to asking std::async for an immediate on-thread calculation. But maybe you want to do it anyway because you are interfacing with some other component that expects to receive a future. How could you get the same result?
We’ll look at that next time.
The post C++ futures part 3: The mental model for <CODE>std::async</CODE> appeared first on The Old New Thing.
Last time, we looked at the “state” that powers the std::promise, std::packaged_task, std::async, std::future, and std::sharedfuture classes. Now we’ll see how that “state” (which I call the source) gets used and passed around.
The lifetime of the source is managed by a std::shared_ptr<source<T>>. Everybody who has a reference to the source uses this shared pointer.
The simplest case is std::promise. The operations on std::promise pretty much map directly to the operations on the source we laid out last time.
The next more complicated case is the std::packaged_task. This takes a callable and saves it for later. You can then call get_future to get a future and hand it to somebody as an IOU for “A value will appear here someday.”
When you want to produce a value, you invoke the packaged_task with whatever parameters you want to pass to the original callable. The result of the invocation (either a value or an exception) is then stored in the source object, which can then be retrieved by the future.
You can imagine a packaged task as just wrapping a promise:
template<typename R, typename... Args>
class packaged_task
{
std::promise<R> p;
std::function<R(Args...)> func;
public:
template<typename F>
packaged_task(F&& f) : func(std::forward<F>(f)) {}
auto get_future() { return p.get_future(); }
void operator()(Args... args) {
try {
p.set_value(func(args...));
} catch (...) {
p.set_exception(std::current_exception());
}
}
};
When you invoke it, it calls the stored callable with the arguments and puts the result in the promise.
Okay, those were the easy cases of pushing values into the source. Next time, we’ll look at the messy case: std::async.
The post C++ futures part 2: The mental model for <CODE>std::promise</CODE>, <CODE>std::packaged_task</CODE> appeared first on The Old New Thing.